package com.sheng.leetcode.year2023.month03.day02;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2023/03/02
 * <p>
 * 面试题 05.02. 二进制数转字符串<p>
 * <p>
 * 二进制数转字符串。给定一个介于0和1之间的实数（如0.72），类型为double，<p>
 * 打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示，则打印“ERROR”。<p>
 * <p>
 * 示例1:<p>
 * 输入：0.625<p>
 * 输出："0.101"<p>
 * <p>
 * 示例2:<p>
 * 输入：0.1<p>
 * 输出："ERROR"<p>
 * 提示：0.1无法被二进制准确表示<p>
 * <p>
 * 提示：<p>
 * 32位包括输出中的 "0." 这两位。<p>
 * 题目保证输入用例的小数位数最多只有 6 位<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/bianry-number-to-string-lcci">面试题 05.02. 二进制数转字符串</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode0502 {

    @Test
    public void test01() {
        double num = 0.625;
//        double num = 0.1;
        System.out.println(new Solution().printBin(num));
    }
}

class Solution {
    public String printBin(double num) {
        StringBuilder ans = new StringBuilder("0.");
        // 保证 num 不为 0 的同时，转化成的字符串长度不能超过 32
        while (ans.length() < 32 && num != 0) {
            // 小数部分转二进制乘 2 取整
            num *= 2;
            // 取整
            int x = (int) num;
            // 拼接
            ans.append(x);
            num -= x;
        }
        return num != 0 ? "ERROR" : ans.toString();
    }
}
